﻿using DAL;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BEL
{
    public class Cliente
    {
        #region atributos
        private int _clienteId;
        private Usuario _usuario;
        private String _clienteNombre;
        private String _clienteApellido;
        private String _clienteDireccion;
        private Ciudad _clienteCiudad;
        private String _clienteMail;
        private String _clienteSexo;
        private DateTime _clienteFechaNacimiento;
        private String _clienteTelefono;
        private int _usuIdAlta;
        private DateTime _fechaAlta;
        private int _usuIdModifica;
        private DateTime _fechaModifica;
        #endregion

        #region properties
        public int UsuIdAlta
        {
            get { return _usuIdAlta; }
            set { _usuIdAlta = value; }
        }


        public DateTime FechaAlta
        {
            get { return _fechaAlta; }
            set { _fechaAlta = value; }
        }

        public int UsuIdModifica
        {
            get { return _usuIdModifica; }
            set { _usuIdModifica = value; }
        }


        public DateTime FechaModifica
        {
            get { return _fechaModifica; }
            set { _fechaModifica = value; }
        }

        public String ClienteTelefono
        {
            get { return _clienteTelefono; }
            set { _clienteTelefono = value; }
        }


        public DateTime ClienteFechaNacimiento
        {
            get { return _clienteFechaNacimiento; }
            set { _clienteFechaNacimiento = value; }
        }

        public String ClienteSexo
        {
            get { return _clienteSexo; }
            set { _clienteSexo = value; }
        }

        public String ClienteMail
        {
            get { return _clienteMail; }
            set { _clienteMail = value; }
        }

        public Ciudad ClienteCiudad
        {
            get { return _clienteCiudad; }
            set { _clienteCiudad = value; }
        }

        public String ClienteDireccion
        {
            get { return _clienteDireccion; }
            set { _clienteDireccion = value; }
        }


        public String Apellido
        {
            get { return _clienteApellido; }
            set { _clienteApellido = value; }
        }

        public String Nombre
        {
            get { return _clienteNombre; }
            set { _clienteNombre = value; }
        }

        public int ClienteId
        {
            get { return _clienteId; }
            set { _clienteId = value; }
        }

        internal Usuario Usuario
        {
            get { return _usuario; }
            set { _usuario = value; }
        }
        #endregion

        #region constructores

        public Cliente(int clienteId, Usuario usuario, String clienteNombre, String clienteApellido, String clienteDireccion,
            Ciudad clienteCiudad, String clienteMail, String clienteSexo, DateTime clienteFechaNacimiento, String clienteTelefono,
            int usuIdAlta, DateTime fechaAlta, int usuIdModifica, DateTime fechaModifica)
        {

            _clienteId = clienteId;
            _usuario = usuario;
            _clienteNombre = clienteNombre;
            _clienteApellido = clienteApellido;
            _clienteDireccion = clienteDireccion;
            _clienteCiudad = clienteCiudad;
            _clienteMail = clienteMail;
            _clienteSexo = clienteSexo;
            _clienteFechaNacimiento = clienteFechaNacimiento;
            _clienteTelefono = clienteTelefono;
            _usuIdAlta = usuIdAlta;
            _fechaAlta = fechaAlta;
            _usuIdModifica = usuIdModifica;
            _fechaModifica = fechaModifica;

        }

        public Cliente(int clienteId, Usuario usuario, String clienteNombre, String clienteApellido, String clienteDireccion,
            Ciudad clienteCiudad, String clienteMail, String clienteSexo, DateTime clienteFechaNacimiento, String clienteTelefono)
        {

            _clienteId = clienteId;
            _usuario = usuario;
            _clienteNombre = clienteNombre;
            _clienteApellido = clienteApellido;
            _clienteDireccion = clienteDireccion;
            _clienteCiudad = clienteCiudad;
            _clienteMail = clienteMail;
            _clienteSexo = clienteSexo;
            _clienteFechaNacimiento = clienteFechaNacimiento;
            _clienteTelefono = clienteTelefono;
        }

        public Cliente()
        {

        }

        #endregion

        #region funciones

        public static int BorrarCliente(int usuId)
        {
            DALClientes dalcli = new DALClientes();
            List<SqlParameter> parametrosusu = new List<SqlParameter>();
            List<SqlParameter> parametroscliente = new List<SqlParameter>();

            parametrosusu.Add(new SqlParameter("@UsuId", usuId));
            parametroscliente.Add(new SqlParameter("@CliUsuario", usuId));

            return dalcli.BorrarCliente(parametrosusu, parametroscliente);
        }


        public static Cliente BuscarCliente(int UsuId)
        {
            DALClientes dalcli = new DALClientes();
            SqlDataReader dr = dalcli.BuscarCliente(UsuId);
            Cliente cli = null;
            while (dr.Read())
            {
                cli = new Cliente();
                cli.ClienteId = (int)dr["CliId"];
                cli.Nombre = (String)dr["CliNombre"];
                cli.Apellido = (String)dr["CliApellido"];
                cli.ClienteDireccion = (String)dr["CliDireccion"];
                cli.ClienteCiudad = Ciudad.BuscarCiudadesPorId((int)dr["CiudadId"]);
                cli.ClienteMail = (String)dr["CliCorreo"];
                cli.ClienteSexo = (String)dr["CliSexo"];
                cli.ClienteFechaNacimiento = (DateTime)dr["CliFechaNacimiento"];
                cli.ClienteTelefono = (String)dr["CliTelefono"];
                cli.Usuario = Usuario.BuscarUsuario((int)dr["CliUsuario"]);
            }
            dr.Close();
            return cli;
        }

        public static Usuario ModificarCliente(int Usuid, String usuNombre, String usuPassword, Usuario.Roles rolString, String cliNombre, String cliApellido, String cliDireccion, int ciudad, String cliCorreo,
            String cliSexo, DateTime cliFechaNacimiento, String telefono)
        {
            DALClientes dalcli = new DALClientes();
            List<SqlParameter> parametrosusu = new List<SqlParameter>();
            List<SqlParameter> parametroscliente = new List<SqlParameter>();

            parametrosusu.Add(new SqlParameter("@UsuId", Usuid));
            parametrosusu.Add(new SqlParameter("@UsuNombre", usuNombre));
            parametrosusu.Add(new SqlParameter("@UsuPassword", usuPassword));
            parametrosusu.Add(new SqlParameter("@Rol", rolString));

            parametroscliente.Add(new SqlParameter("@CliNombre", cliNombre));
            parametroscliente.Add(new SqlParameter("@CliApellido", cliApellido));
            parametroscliente.Add(new SqlParameter("@CliDireccion", cliDireccion));
            parametroscliente.Add(new SqlParameter("@CiudadId", ciudad));
            parametroscliente.Add(new SqlParameter("@CliCorreo", cliCorreo));
            parametroscliente.Add(new SqlParameter("@CliSexo", cliSexo));
            parametroscliente.Add(new SqlParameter("@CliFechaNacimiento", cliFechaNacimiento));
            parametroscliente.Add(new SqlParameter("@CliTelefono", telefono));
            parametroscliente.Add(new SqlParameter("@CliUsuario", Usuid));

            int retorno = dalcli.ModificarCliente(parametrosusu, parametroscliente);
            if (retorno > 0)
            {
                BEL.Usuario usu = BEL.Usuario.BuscarUsuario(Usuid);
                return usu;
            }
            else
            {
                return null;
            }

        }

        public static int AltaCliente(String usuNombre, String usuPassword, Usuario.Roles rolString, String cliNombre, String cliApellido, String cliDireccion, int ciudad, String cliCorreo,
            String cliSexo, DateTime cliFechaNacimiento, String telefono)
        {
            DALClientes dalcli = new DALClientes();
            List<SqlParameter> parametrosusu = new List<SqlParameter>();
            List<SqlParameter> parametroscliente = new List<SqlParameter>();

            parametrosusu.Add(new SqlParameter("@UsuNombre", usuNombre));
            parametrosusu.Add(new SqlParameter("@UsuPassword", usuPassword));
            parametrosusu.Add(new SqlParameter("@Rol", rolString.ToString()));

            parametroscliente.Add(new SqlParameter("@CliNombre", cliNombre));
            parametroscliente.Add(new SqlParameter("@CliApellido", cliApellido));
            parametroscliente.Add(new SqlParameter("@CliDireccion", cliDireccion));
            parametroscliente.Add(new SqlParameter("@CiudadId", ciudad));
            parametroscliente.Add(new SqlParameter("@CliCorreo", cliCorreo));
            parametroscliente.Add(new SqlParameter("@CliSexo", cliSexo));
            parametroscliente.Add(new SqlParameter("@CliFechaNacimiento", cliFechaNacimiento));
            parametroscliente.Add(new SqlParameter("@CliTelefono", telefono));

            int idusu = dalcli.GuardarCliente(parametrosusu, parametroscliente);
            return idusu;
        }

        public Hashtable toHashtable()
        {
            Hashtable hash = new Hashtable();
    
            if (!string.IsNullOrEmpty(ClienteId.ToString()))
            {
                hash.Add("ClienteId", this.ClienteId);
            }
            hash.Add("Nombre", this.Nombre);
            hash.Add("Apellido", this.Apellido);
            hash.Add("ClienteDireccion", this.ClienteDireccion);
            hash.Add("ClienteCiudad", this.ClienteCiudad.CiudadId);
            hash.Add("ClienteMail", this.ClienteMail);
            hash.Add("ClienteSexo", this.ClienteSexo);
            hash.Add("ClienteFechaNacimiento", this.ClienteFechaNacimiento);
            hash.Add("ClienteTelefono", this.ClienteTelefono);
            hash.Add("Usuario", this.Usuario.UsuarioId);
            return hash;

        }

        public void fromHashtable(Hashtable ht)
        {
            /*this.Nombre = cliNombre;
            this.Apellido = cliApellido;
            this.ClienteDireccion = cliDireccion;
            this.ClienteCiudad = ciudad;
            this.ClienteMail = cliCorreo;
            this.ClienteSexo = cliSexo;
            this.ClienteFechaNacimiento = cliFechaNacimiento;
            this.ClienteTelefono = telefono;
            this.Usuario = usu;


            this.UsuarioId = Convert.ToInt32(ht["UsuarioId"].ToString());
            this.UsuarioNombre = ht["UsuarioNombre"].ToString();
            this.UsuarioPassword = ht["UsuarioPassword"].ToString();
            this.Rol = this.rolDeString(ht["Rol"].ToString());*/

        }


        #endregion
    }  
}
